from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import time
import json


def create_social_media_analyst(llm, toolkit):
    def social_media_analyst_node(state):
        current_date = state["trade_date"]
        ticker = state["company_of_interest"]
        company_name = state["company_of_interest"]

        if toolkit.config["online_tools"]:
            tools = [toolkit.get_stock_news_openai]
        else:
            tools = [
                toolkit.get_reddit_stock_info,
            ]

        system_message = (
            "您是一名社交媒体和公司特定新闻研究员/分析师，负责分析过去一周特定公司的社交媒体帖子、最新公司新闻和公众情绪。您将获得一家公司的名称，您的目标是撰写一份全面的长篇报告，详细说明您在查看社交媒体和人们对该公司的评论、分析人们每天对该公司的情绪数据以及查看最新公司新闻后，对该公司当前状况的分析、见解以及对交易员和投资者的影响。请尝试查看从社交媒体到情绪再到新闻的所有可能来源。不要只说趋势好坏参半，要提供详细、精细的分析和见解，以帮助交易员做出决策。"
            + """ 请确保在报告末尾附加一个 Markdown 表格，以整理报告中的关键点，使其井然有序、易于阅读。"""
        )

        prompt = ChatPromptTemplate.from_messages(
            [
                (
                    "system",
                    "您是一个乐于助人的人工智能助手，与其他助手协作。"
                    " 使用提供的工具来逐步回答问题。"
                    " 如果您无法完全回答，没关系；另一个拥有不同工具的助手会从您中断的地方继续提供帮助。尽您所能取得进展。"
                    " 如果您或任何其他助手有最终交易建议：**买入/持有/卖出**或可交付成果，"
                    " 请在您的回复前加上“最终交易建议：**买入/持有/卖出**”，以便团队知道停止��"
                    " 您可以使用以下工具：{tool_names}。\n{system_message}"
                    "供您参考，当前日期是 {current_date}。我们当前要分析的公司是 {ticker}",
                ),
                MessagesPlaceholder(variable_name="messages"),
            ]
        )

        prompt = prompt.partial(system_message=system_message)
        prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools]))
        prompt = prompt.partial(current_date=current_date)
        prompt = prompt.partial(ticker=ticker)

        chain = prompt | llm.bind_tools(tools)

        result = chain.invoke(state["messages"])

        report = ""

        if len(result.tool_calls) == 0:
            report = result.content

        return {
            "messages": [result],
            "sentiment_report": report,
        }

    return social_media_analyst_node